import auth from '@/plugins/auth'
import router, { constantRoutes, dynamicRoutes } from '@/router'
import { getRouters } from '@/api/menu'
import Layout from '@/layout/index'
import ParentView from '@/components/ParentView'
import InnerLink from '@/layout/components/InnerLink'

// 匹配views里面所有的.vue文件
const modules = import.meta.glob('./../../views/**/*.vue')

const usePermissionStore = defineStore(
  'permission',
  {
    state: () => ({
      routes: [],
      addRoutes: [],
      defaultRoutes: [],
      topbarRouters: [],
      sidebarRouters: [],
      indexPage:""
    }),
    actions: {
      setRoutes(routes) {
        this.addRoutes = routes
        this.routes = constantRoutes.concat(routes)
      },
      setDefaultRoutes(routes) {
        this.defaultRoutes = constantRoutes.concat(routes)
      },
      setTopbarRoutes(routes) {
        this.topbarRouters = routes
      },
      setSidebarRouters(routes) {
        this.sidebarRouters = routes
      },
        SET_INDEX_PAGE(routes){
      this.indexPage = routes
    },
      generateRoutes(roles) {
     
          // 向后端请求路由数据
       return new Promise(resolve => {
        const res = {
    "msg":"操作成功",
    "code":200,
    "data":[
        {
            "name":"Building",
            "path":"/building",
            "hidden":false,
            "redirect":"noRedirect",
            "component":"Layout",
            "alwaysShow":true,
            "meta":{
                "title":"建筑类型",
                "icon":"server",
                "noCache":false,
                "link":null
            },
            "children":[
                {
                    "name":"Type",
                    "path":"type",
                    "hidden":false,
                    "component":"system/buildingType/type/index",
                    "meta":{
                        "title":"类型",
                        "icon":"#",
                        "noCache":true,
                        "link":null
                    }
                },
                {
                    "name":"Color",
                    "path":"color",
                    "hidden":false,
                    "component":"system/buildingType/color/index",
                    "meta":{
                        "title":"颜色",
                        "icon":"#",
                        "noCache":true,
                        "link":null
                    }
                },
                {
                    "name":"Use-part",
                    "path":"use-part",
                    "hidden":false,
                    "component":"system/buildingType/usePart/index",
                    "meta":{
                        "title":"使用部位",
                        "icon":"#",
                        "noCache":true,
                        "link":null
                    }
                },
                {
                    "name":"Color-system",
                    "path":"color-system",
                    "hidden":false,
                    "component":"system/buildingType/colorSystem/index",
                    "meta":{
                        "title":"色系/档次",
                        "icon":"#",
                        "noCache":true,
                        "link":null
                    }
                }
            ]
        },
      
        {
            "path":"/",
            "hidden":false,
            "component":"Layout",
            "children":[
                {
                    "name":"Match",
                    "path":"match",
                    "hidden":false,
                    "component":"system/matchManagement/index",
                    "meta":{
                        "title":"匹配管理",
                        "icon":"build",
                        "noCache":true,
                        "link":null
                    }
                }
            ]
        },
        
    
        {
            "name":"Monitor",
            "path":"/monitor",
            "hidden":true,
            "redirect":"noRedirect",
            "component":"Layout",
            "alwaysShow":true,
            "meta":{
                "title":"系统监控",
                "icon":"monitor",
                "noCache":false,
                "link":null
            },
            "children":[
                {
                    "name":"Online",
                    "path":"online",
                    "hidden":false,
                    "component":"monitor/online/index",
                    "meta":{
                        "title":"在线用户",
                        "icon":"online",
                        "noCache":false,
                        "link":null
                    }
                },
                {
                    "name":"Job",
                    "path":"job",
                    "hidden":false,
                    "component":"monitor/job/index",
                    "meta":{
                        "title":"定时任务",
                        "icon":"job",
                        "noCache":false,
                        "link":null
                    }
                },
                {
                    "name":"Druid",
                    "path":"druid",
                    "hidden":false,
                    "component":"monitor/druid/index",
                    "meta":{
                        "title":"数据监控",
                        "icon":"druid",
                        "noCache":false,
                        "link":null
                    }
                },
                {
                    "name":"Server",
                    "path":"server",
                    "hidden":false,
                    "component":"monitor/server/index",
                    "meta":{
                        "title":"服务监控",
                        "icon":"server",
                        "noCache":false,
                        "link":null
                    }
                },
                {
                    "name":"Cache",
                    "path":"cache",
                    "hidden":false,
                    "component":"monitor/cache/index",
                    "meta":{
                        "title":"缓存监控",
                        "icon":"redis",
                        "noCache":false,
                        "link":null
                    }
                },
                {
                    "name":"CacheList",
                    "path":"cacheList",
                    "hidden":false,
                    "component":"monitor/cache/list",
                    "meta":{
                        "title":"缓存列表",
                        "icon":"redis-list",
                        "noCache":false,
                        "link":null
                    }
                }
            ]
        },
        {
            "name":"Tool",
            "path":"/tool",
            "hidden":true,
            "redirect":"noRedirect",
            "component":"Layout",
            "alwaysShow":true,
            "meta":{
                "title":"系统工具",
                "icon":"tool",
                "noCache":false,
                "link":null
            },
            "children":[
                {
                    "name":"Build",
                    "path":"build",
                    "hidden":false,
                    "component":"tool/build/index",
                    "meta":{
                        "title":"表单构建",
                        "icon":"build",
                        "noCache":false,
                        "link":null
                    }
                },
                {
                    "name":"Gen",
                    "path":"gen",
                    "hidden":false,
                    "component":"tool/gen/index",
                    "meta":{
                        "title":"代码生成",
                        "icon":"code",
                        "noCache":false,
                        "link":null
                    }
                },
                {
                    "name":"Swagger",
                    "path":"swagger",
                    "hidden":false,
                    "component":"tool/swagger/index",
                    "meta":{
                        "title":"系统接口",
                        "icon":"swagger",
                        "noCache":false,
                        "link":null
                    }
                }
            ]
        },
        {
            "name":"Http://ruoyi.vip",
            "path":"http://ruoyi.vip",
            "hidden":true,
            "component":"Layout",
            "meta":{
                "title":"若依官网",
                "icon":"guide",
                "noCache":false,
                "link":"http://ruoyi.vip"
            }
        },
        {
            "path":"/",
            "hidden":false,
            "component":"Layout",
            "children":[
                {
                    "name":"material",
                    "path":"material",
                    "hidden":false,
                    "component":"system/material/index",
                    "meta":{
                        "title":"材料大类",
                        "icon":"date-range",
                        "noCache":true,
                        "link":null
                    }
                }
            ]
        },
        {
            "path":"/",
            "hidden":false,
            "component":"Layout",
            "children":[
                {
                    "name":"Level-third",
                    "path":"level-third",
                    "hidden":false,
                    "component":"system/levelThird/index",
                    "meta":{
                        "title":"三级材料",
                        "icon":"date-range",
                        "noCache":true,
                        "link":null
                    }
                }
            ]
        },
        
        {
            "path":"/",
            "hidden":false,
            "component":"Layout",
            "children":[
                {
                    "name":"material-management",
                    "path":"material-management",
                    "hidden":false,
                    "component":"system/materialManagement/index",
                    "meta":{
                        "title":"材料商管理",
                        "icon":"build",
                        "noCache":true,
                        "link":null
                    }
                }
            ]
        },
        {
            "path":"/",
            "hidden":false,
            "component":"Layout",
            "children":[
                {
                    "name":"product-management",
                    "path":"product-management",
                    "hidden":false,
                    "component":"system/productManagement/index",
                    "meta":{
                        "title":"商品管理",
                        "icon":"build",
                        "noCache":true,
                        "link":null
                    }
                }
            ]
        },
    ]
}
            const sdata = JSON.parse(JSON.stringify(res.data))
            const rdata = JSON.parse(JSON.stringify(res.data))


let indexdata = res.data[0].path + "/" + res.data[0].children[0].path
  if (res.data[0].children[0].query !== undefined) { //如果当前路由存在路由参数，则带入
    let query = JSON.parse(res.data[0].children[0].query);
    let temp = '';
    for (var val in query) {
      if (temp.length == 0) {
        temp = "?";
      } else {
        temp = temp + "&";
      }
      temp = temp + val + "=" + query[val];
    }
    indexdata = indexdata + temp;
  }



            const defaultData = JSON.parse(JSON.stringify(res.data))
            const sidebarRoutes = filterAsyncRouter(sdata)
            const rewriteRoutes = filterAsyncRouter(rdata, false, true)
            const defaultRoutes = filterAsyncRouter(defaultData)
            const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
            asyncRoutes.forEach(route => { router.addRoute(route) })
            this.setRoutes(rewriteRoutes)
            this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
            this.setDefaultRoutes(sidebarRoutes)
            this.setTopbarRoutes(defaultRoutes)
            this.SET_INDEX_PAGE(indexdata)
            resolve(rewriteRoutes)
         
        })
        // return new Promise(resolve => {
        //   // 向后端请求路由数据
        //   getRouters().then(res => {
        //     const sdata = JSON.parse(JSON.stringify(res.data))
        //     const rdata = JSON.parse(JSON.stringify(res.data))
        //     const defaultData = JSON.parse(JSON.stringify(res.data))
        //     const sidebarRoutes = filterAsyncRouter(sdata)
        //     const rewriteRoutes = filterAsyncRouter(rdata, false, true)
        //     const defaultRoutes = filterAsyncRouter(defaultData)
        //     const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
        //     asyncRoutes.forEach(route => { router.addRoute(route) })
        //     this.setRoutes(rewriteRoutes)
        //     this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
        //     this.setDefaultRoutes(sidebarRoutes)
        //     this.setTopbarRoutes(defaultRoutes)
        //     resolve(rewriteRoutes)
        //   })
        // })
      }
    }
  })

// 遍历后台传来的路由字符串，转换为组件对象
function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
  return asyncRouterMap.filter(route => {
    if (type && route.children) {
      route.children = filterChildren(route.children)
    }
    if (route.component) {
      // Layout ParentView 组件特殊处理
      if (route.component === 'Layout') {
        route.component = Layout
      } else if (route.component === 'ParentView') {
        route.component = ParentView
      } else if (route.component === 'InnerLink') {
        route.component = InnerLink
      } else {
        route.component = loadView(route.component)
      }
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, route, type)
    } else {
      delete route['children']
      delete route['redirect']
    }
    return true
  })
}

function filterChildren(childrenMap, lastRouter = false) {
  var children = []
  childrenMap.forEach((el, index) => {
    if (el.children && el.children.length) {
      if (el.component === 'ParentView' && !lastRouter) {
        el.children.forEach(c => {
          c.path = el.path + '/' + c.path
          if (c.children && c.children.length) {
            children = children.concat(filterChildren(c.children, c))
            return
          }
          children.push(c)
        })
        return
      }
    }
    if (lastRouter) {
      el.path = lastRouter.path + '/' + el.path
    }
    children = children.concat(el)
  })
  return children
}

// 动态路由遍历，验证是否具备权限
export function filterDynamicRoutes(routes) {
  const res = []
  routes.forEach(route => {
    if (route.permissions) {
      if (auth.hasPermiOr(route.permissions)) {
        res.push(route)
      }
    } else if (route.roles) {
      if (auth.hasRoleOr(route.roles)) {
        res.push(route)
      }
    }
  })
  return res
}

export const loadView = (view) => {
  let res;
  for (const path in modules) {
    const dir = path.split('views/')[1].split('.vue')[0];
    if (dir === view) {
      res = () => modules[path]();
    }
  }
  return res;
}

export default usePermissionStore
